<?php

namespace Api\Openapi\Pay;


use Api\Openapi\Util;

/**
 * Class Txn
 * @package Api\Openapi\Pay
 * @description 支付交易sdk
 */
class Txn {

    const URI_PAY_AUTHORIZE = '/pay/authorize';  //短信鉴权
    const URI_PAY_TXN = "/pay/txn";  //实时交易

    const SERVICE_KUAIQIAN = "kuaiqian";  //快钱支付

    const CERT_TYPE_ID_CARD = "01";  //证件类型－身份证

    const RESP_STATUS_SUCC = 0;
    const RESP_STATUS_HANDLING = 1;
    const RESP_STATUS_FAIL = 2;

    /**
     * 短信验证
     *
     * @param string $service       支付服务方名称，参考在本类中定义常量：e.g. \Api\Openapi\Pay::SERVICE_KUAIQIAN
     * @param string $mobile        手机号
     * @param string $card_no       银行卡账号
     * @param string $cert_type     证件类型(e.g. 身份证 self::CERT_TYPE_ID_CARD)
     * @param string $cert_no       证件号
     * @param string $name          姓名
     * @param array $options        查询选项，根据支付服务方上送不同值，
     *                              array(
     *                                  'ori_trans_id'  string  M  商户流水号
     *                                  'mer_id'        string  M  商户号 e.g. 'mer_id_qianlong_recharge'
     *                                  'cust_id'       string  M  客户号
     *                                  'amt'           int     M  交易金额(单位为分) e.g. 1010 = 10.10元
     *                                  'expire_date'   string  O  信用卡的有效期, 4位定长数字字符, 格式为MMYY e.g. 1007 = 2007年10月
     *                                  'cvv2'          string  O  安全校验值, 3位定长数字字符, 对于银联和 VISA 卡,对应卡片背面的 CVV2 数字;对于 MasterCard 卡,对应卡片背面的 CVC2 数字
     *                              );
     * @param int $timeout default 20000
     * @return array              成功返回 array(
     *                               'merchantId'  string  商户编号  15位字母和数字字符串
     *                               'customerId'  string  客户号
     *                               'storablePan' string  缩略卡号  卡号前6位+后4位组成的10位数字字符串
     *                               'token'       string  手机验证码令牌
     *                               'status'      int     0-成功 1-处理中 2-失败
     *                               'ori_trans_id' string 请求时送入的商户流水号
     *                             );
     */
    public function authorize($service, $mobile, $card_no, $cert_type, $cert_no, $name, array $options, $timeout = 20000){
        $body = array(
            'service' => $service,
            'mobile' => $mobile,
            'cert_type' => $cert_type,
            'cert_no' => $cert_no,
            'name' => $name,
            'acct' => $card_no,
            'options' => $options
        );
        $params = array(
            "header" => array(),
            "body" => $body,
        );

        $resp_data = Util::request(self::URI_PAY_AUTHORIZE, $params, $timeout)["body"];

        return $resp_data;
    }

    /**
     * 实时交易
     *
     * @param string $service 支付服务方名称，参考在本类中定义常量：e.g. \Api\Openapi\Pay::SERVICE_JINTONG
     * @param string $trans_id 交易id，必送，用于未来对账
     * @param string $trans_timestamp 交易时间戳，必送，保证支付双方一致(e.g. 使用time()生成的时间戳)
     * @param string $cert_type 支付方证件类型(参考本类中常量 e.g. 身份证 self::CERT_TYPE_ID_CARD)
     * @param string $cert_no 支付方证件号码
     * @param string $name 支付方姓名
     * @param string $acct 支付方支付账号
     * @param int $amt 支付金额，以分作为最小单位计算：e.g 125.30 元 = 12530 分
     * @param array $options default array() 代付选项，根据支付服务方上送不同值，
     *                                       详情参考：@link http://wiki.i.beebank.com/pages/viewpage.action?pageId=6619448
     *
     * @return array|bool 交易成功返回：
     *                        serial_no     string 商户交易id        must
     *                        trans_serial_no string 支付平台交易id   optional
     *                        trans_time    string 交易时间          must
     *                        amt           int    交易金额(单位为分)  optional
     *                        status        int    交易状态(0-成功 1-处理中 2-失败)   optional
     *                    失败返回false
     * @throws \S\Exception
     */
    public function pay($service, $trans_id, $trans_timestamp, $cert_type, $cert_no, $name, $acct, $amt, array $options = array()) {
        $body = array(
            "service" => $service,
            "trans_id" => $trans_id,
            "trans_time" => $trans_timestamp,
            "cert_type" => $cert_type,
            "cert_no" => $cert_no,
            "name" => $name,
            "acct" => $acct,
            "amt" => $amt,
            "options" => $options,
        );
        $params = array(
            "header" => array(),
            "body" => $body,
        );

        $resp_data = Util::request(self::URI_PAY_TXN, $params)["body"];

        return $resp_data;
    }

} 